package com.atguigu.ArrayList;

/**
 * @author durant
 * @create 2021-10-21 16:26
 */
public class ArrayList01<E> {
    //实际存储元素的容器
    private E[] elementData;
    private static final int INIT_CAPACITY = 10;
    private int size;

    //空构造器，创建一个指定长度的数组对象
    public ArrayList01() {
        this(INIT_CAPACITY);
    }

    /**
     * 创建一个带参构造器，创建用户指定长度的数组对象
     *
     * @param capacity
     */
    public ArrayList01(int capacity) {
        this.elementData = (E[]) new Object[capacity];
    }

    /**
     * 判断size是否为空
     *
     * @return size==0 如果成立，则集合为空
     */
    public boolean isempty() {
        return size == 0;
    }

    /**
     * 返回集合的大小
     */
    public int count() {
        return size;
    }

    public void add(E e) {
        addLast(e);
    }

    /**
     * 添加到末尾
     *
     * @param e
     */
    public void addLast(E e) {
        elementData[size] = e;//
        size++;//维护一下size
    }

    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("size:" + size + " [");
        for (int i = 0; i < size; i++) {
            builder.append(elementData[i]);
            if (i != size - 1)
                builder.append(",");
        }
        builder.append("]");
        return builder.toString();
    }

    /**
     * @param e
     * @param index 添加的位置索引
     */
    public void add(E e, int index) {
        //判定index 的合法性，如果index大于size的值，那么会出现内存碎片
        checkIndex(index);
        //循环挪动元素
        for (int i = size; i > index; i--) {
            elementData[i] = elementData[i - 1];
        }
        size++;
        elementData[index] = e;
    }
    public void addFirst(E e){
        add(e, 0);

    }
    /**
     * 检验index合法性的方法
     *
     * @param index
     */
    private void checkIndex(int index) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("index out of bounds index:" + index);
        }
    }
}
